package OOP2;

import java.util.Objects;
import java.util.UUID;

/**
 * 内部类专题示例
 * 演示内容：
 * 1. 成员内部类的实例化与访问控制
 * 2. 静态嵌套类的特性
 * 3. 匿名内部类的实际应用
 * 4. 外部类私有成员的访问机制
 */
public class InnerClassDemo {

    // ==================== 成员内部类示例 ====================
    /**
     * 外部类包含私有字段和内部类
     */
    static class Outer {
        private String instanceName;
        private static final String CLASS_ID = "OUTER_CLASS_001";

        public Outer(String name) {
            this.instanceName = Objects.requireNonNull(name, "外部类名称不能为空");
        }

        /**
         * 成员内部类（自动持有外部类引用）
         */
        class Inner {
            private final String innerId;

            public Inner(String id) {
                this.innerId = id;
            }

            public void displayInfo() {
                System.out.println("外部实例名称: " + instanceName);
                System.out.println("内部类标识: " + innerId);
                System.out.println("共享类标识: " + CLASS_ID);
            }
        }

        // ==================== 静态嵌套类示例 ====================
        /**
         * 静态嵌套类（仅能访问外部类静态成员）
         */
        static class StaticNested {
            public void showClassInfo() {
                System.out.println("外部类静态标识: " + CLASS_ID);
                // System.out.println(instanceName); // 编译错误：无法访问非静态成员
            }
        }
    }

    // ==================== 匿名内部类示例 ====================
    /**
     * 事件处理器接口（演示匿名内部类）
     */
    interface EventHandler {
        void handle(String eventData);
        default String getHandlerInfo() {
            return "默认处理器信息";
        }
    }

    /**
     * 包含状态的外部类
     */
    class EventSource {
        private String state = "活跃状态";

        public EventHandler createEventHandler() {
            // 匿名内部类实现接口
            return new EventHandler() {
                private final String handlerId = UUID.randomUUID().toString();

                @Override
                public void handle(String eventData) {
                    System.out.println("处理事件: " + eventData);
                    System.out.println("当前状态: " + state);
                    System.out.println("处理器ID: " + handlerId);
                }

                @Override
                public String getHandlerInfo() {
                    return "自定义处理器 [" + handlerId + "]";
                }
            };
        }
    }

    // ==================== 使用演示方法 ====================
    public void demonstrateInnerClasses() {
        // 成员内部类演示
        Outer outer = new Outer("测试实例");
        Outer.Inner inner = outer.new Inner("INNER_001");
        inner.displayInfo();

        // 静态嵌套类演示
        Outer.StaticNested nested = new Outer.StaticNested();
        nested.showClassInfo();

        // 匿名内部类演示
        EventSource source = new EventSource();
        EventHandler handler = source.createEventHandler();
        handler.handle("示例事件数据");
        System.out.println(handler.getHandlerInfo());
    }

    // ==================== 主测试方法 ====================
    public static void main(String[] args) {
        InnerClassDemo demo = new InnerClassDemo();

        System.out.println("==== 成员内部类演示 ====");
        demo.demonstrateInnerClasses();

        System.out.println("\n==== 匿名内部类特性验证 ====");
        EventSource source = demo.new EventSource();
        EventHandler handler1 = source.createEventHandler();
        EventHandler handler2 = source.createEventHandler();
        handler1.handle("第一次事件");
        handler2.handle("第二次事件");
    }
}